\chapter{UML}

\section{UML}

\subsection{UML（Unified Modeling Language）}

统一建模语言UML是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言。\\

UML中包含了一系列不同类型的图：

\begin{itemize}
    \item 类图
    \item 组件图
    \item 部署图
    \item 对象图
    \item 封装图
    \item 复合结构图
    \item 剖面图
    \item 用例图
    \item 活动图
    \item 状态机图
    \item 序列图
    \item 通讯图
    \item 交互概览图
    \item 时序图
\end{itemize}

这些图主要可分为三大类：

\begin{enumerate}
    \item 功能模型（functional model）：从用户的角度展示系统的功能，如用例图。
    \item 对象模型（object model）：采用对象、属性、操作、关联等展示系统的结构，如类图、对象图。
    \item 动态模型（dynamic model）：展现系统的内部行为，如时序图、活动图、状态图。
\end{enumerate}

\newpage

\section{用例图}

\subsection{用例图（Use Case Diagram）}

用例图用于描述从用户角度所看到的系统功能。通过用例图，人们可以获知系统不同种类的用户和用例。\\

\begin{figure}[H]
    \centering
    \begin{tikzpicture}
        \draw (0,0) rectangle (6,17);
        \node at (1.5,16.5) {Bank ATM};
        \draw (3,14.5) ellipse (2 and 1) node {查看余额};
        \draw (3,12) ellipse (2 and 1) node {存款};
        \draw (3,9.5) ellipse (2 and 1) node {取款};
        \draw (3,7) ellipse (2 and 1) node {转账};
        \draw (3,4.5) ellipse (2 and 1) node {维护};
        \draw (3,2) ellipse (2 and 1) node {维修};

        \draw (-3,13) circle (0.25);
        \draw (-3.5,12.5) -- (-2.5,12.5);
        \draw (-3,12.75) -- (-3,12);
        \draw (-3,12) -- (-3.5,11.5);
        \draw (-3,12) -- (-2.5,11.5);
        \node at (-3,11) {客户};

        \draw (-3,6) circle (0.25);
        \draw (-3.5,5.5) -- (-2.5,5.5);
        \draw (-3,5.75) -- (-3,5);
        \draw (-3,5) -- (-3.5,4.5);
        \draw (-3,5) -- (-2.5,4.5);
        \node at (-3,4) {技术人员};

        \draw (9,8.5) circle (0.25);
        \draw (9.5,8) -- (8.5,8);
        \draw (9,8.25) -- (9,7.5);
        \draw (9,7.5) -- (9.5,7);
        \draw (9,7.5) -- (8.5,7);
        \node at (9,6.5) {银行};

        \draw (-2,12.5) -- (1,14.5);
        \draw (-2,12.5) -- (1,12);
        \draw (-2,12.5) -- (1,9.5);
        \draw (-2,12.5) -- (1,7);

        \draw (-2,5.5) -- (1,4.5);
        \draw (-2,5.5) -- (1,2);

        \draw (8,8.5) -- (5,14.5);
        \draw (8,8.5) -- (5,12);
        \draw (8,8.5) -- (5,9.5);
        \draw (8,8.5) -- (5,7);
        \draw (8,8.5) -- (5,4.5);
        \draw (8,8.5) -- (5,2);
    \end{tikzpicture}
    \caption{银行ATM系统}
\end{figure}

\newpage

\section{类图}

\subsection{类图（Class Diagram）}

类图用于显示模型的静态结构，例如类的内部结构以及类与类之间的关系。\\

一个类包含属性和方法两部分，在类图中public属性和方法使用“+”表示，private属性和方法使用“-”表示，protected属性和方法使用“\#”表示。\\

\begin{figure}[H]
    \centering
    \begin{tikzpicture}
        \begin{class}[text width = 8cm]{Student}{0,0}
            \attribute{- name : String}
            \attribute{- gender : String}
            \operation{+ Student(String name, String gender)}
            \operation{+ getName() : String}
            \operation{+ setName(String name) : void}
            \operation{+ getGender() : String}
            \operation{+ setGender(String gender) : void}
        \end{class}
    \end{tikzpicture}
    \caption{Student类}
\end{figure}

\vspace{0.5cm}

\subsection{继承（Inheritance）}

\begin{figure}[H]
    \centering
    \begin{tikzpicture}
        \begin{class}[text width = 3cm]{Superclass}{0,0}
        \end{class}

        \begin{class}[text width = 3cm]{Subclass}{0,-3}
            \inherit{Superclass}
        \end{class}
    \end{tikzpicture}
    \caption{继承}
\end{figure}

子类和父类之间存在“is a”的关系，例如Dog和Cat都属于Animal的子类。\\

\subsection{关联（Association）}

\begin{figure}[H]
    \centering
    \begin{tikzpicture}
        \begin{class}[text width = 3cm]{Class 1}{0,0}
        \end{class}

        \begin{class}[text width = 3cm]{Class 2}{7,0}
        \end{class}

        \association {Class 1}{}{}{Class 2}{}{}
    \end{tikzpicture}
    \caption{关联}
\end{figure}

关联关系使一个类能够知道另一个类的属性和方法。关联可以是双向的，也可以是单向的。\\

关联关系还可以指定多重性（multiplicity）。例如一个Student可以和多个Professor存在关联。\\

\begin{figure}[H]
    \centering
    \begin{tikzpicture}
        \begin{class}[text width = 3cm]{Student}{0,0}
        \end{class}

        \begin{class}[text width = 3cm]{Professor}{7,0}
        \end{class}

        \association {Student}{}{}{Professor}{}{1..*}
    \end{tikzpicture}
\end{figure}

一个Professor可以和多个Student存在关联。\\

\begin{figure}[H]
    \centering
    \begin{tikzpicture}
        \begin{class}[text width = 3cm]{Student}{0,0}
        \end{class}

        \begin{class}[text width = 3cm]{Professor}{7,0}
        \end{class}

        \association {Student}{}{*..1}{Professor}{}{}
    \end{tikzpicture}
\end{figure}

多个Professor同样也可以和多个Student存在关联。\\

\begin{figure}[H]
    \centering
    \begin{tikzpicture}
        \begin{class}[text width = 3cm]{Student}{0,0}
        \end{class}

        \begin{class}[text width = 3cm]{Professor}{7,0}
        \end{class}

        \association {Student}{}{*}{Professor}{}{*}
    \end{tikzpicture}
\end{figure}

\vspace{0.5cm}

\subsection{聚合（Aggregation）}

聚合关系是关联联系的特例，用于表示整体和部分的关系，即“has a”。但是整体和部分有各自独立的生命周期。\\

例如Monther有一个Child，但是如果Mother死了，Child仍然存活。\\

\begin{figure}[H]
    \centering
    \begin{tikzpicture}
        \begin{class}[text width = 3cm]{Mother}{0,0}
        \end{class}

        \begin{class}[text width = 3cm]{Child}{7,0}
        \end{class}

        \aggregation {Mother}{}{}{Child}
    \end{tikzpicture}
    \caption{聚合}
\end{figure}

\vspace{0.5cm}

\subsection{组合（Composition）}

组合用于表示“part of”的的关系，因此具有组合关系的两个类具有相同的声明周期。\\

例如血液细胞是身体的一部分，人死了，血液细胞也会死。\\

\begin{figure}[H]
    \centering
    \begin{tikzpicture}
        \begin{class}[text width = 3cm]{Body}{0,0}
        \end{class}

        \begin{class}[text width = 3cm]{Blood Cell}{7,0}
        \end{class}

        \composition {Body}{}{}{Blood Cell}
    \end{tikzpicture}
    \caption{组合}
\end{figure}

\newpage

\section{时序图}

\subsection{时序图（Sequence Diagram）}

时序图通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。\\

时序图中包括以下元素：

\begin{enumerate}
    \item 角色（actor）/对象（object）：系统角色，可以是人或者其它子系统。

    \item 生命线（lifeline）：表示对象在一段时期内的存在。

    \item 控制焦点（activation）：在时序图中每条生命线上的窄矩形代表活动期。

    \item 消息（message）：类角色通过发送和接受信息进行通信。
\end{enumerate}

\begin{figure}[H]
    \centering
    \begin{sequencediagram}
        \newthread{computer}{:Computer}
        \newinst[3]{server}{:Server}

        \begin{messcall}{computer}{sendEmail()}{server}
        \end{messcall}

        \postlevel\postlevel

        \begin{call}{computer}{newEmail()}{server}{response}
        \end{call}

        \postlevel\postlevel

        \begin{messcall}{computer}{deleteEmail()}{server}
        \end{messcall}
    \end{sequencediagram}
    \caption{时序图}
\end{figure}

\newpage